package com.yao;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.name.Rename;

public class Utils {
    /**
     * 允许的图片后缀
     */
    private static final String[] ALLOW_IMG = { "jpg", "png", "jpeg", "gif" };
    /**
     * 配置文件路径
     */
    public static final String CONFIG_PATH = Paths.get(System.getProperty("user.dir"), "config.xml").toString();
    
    /**
     * 获取文件后缀名(转换为小写)
     */
    public static String getExtension(File f) {
        String ext = null;
        String s = f.getName(); // 获取文件名称
        int i = s.lastIndexOf(".");
        if (i > 0 && i <= s.length() - 1) {
            ext = s.substring(i + 1).toLowerCase();
        }
        return ext;
    }

    /**
     * 判断是否是允许的图片后缀
     * @param imgFile   图片文件
     * @return  是否是允许的图片后缀，如果是则返回 true，否正返回 false
     */
    public static boolean isAllowImage(File imgFile) {
        String ext = getExtension(imgFile);
        boolean allow = false;
        for(String s : ALLOW_IMG) {
            if (s.equals(ext)) {
                allow = true;
                break;
            }
        }
        return allow;
    }

     /**
     * 压缩图片
     * @throws IOException
     */
    public static void compress (int width, int height, File srcFile, File toFile) throws IOException {
        HashMap<String, ArrayList<File>> fileMap = new HashMap<String, ArrayList<File>>();
        Path rootPath = srcFile.toPath();
        recursiveDir(rootPath.toFile(), rootPath, fileMap);
        // 遍历进行文件压缩
        for (Entry<String, ArrayList<File>> entry : fileMap.entrySet()) {
            File targetFile = Paths.get(toFile.getPath(), entry.getKey()).toFile();
            if (!targetFile.exists()) {
                targetFile.mkdirs(); // 目标目录不存在，创建目录
            }
            if (width == 0 && height == 0) { // 不进行缩放
                Thumbnails.of(entry.getValue().stream().toArray(File[]::new))
                    .toFiles(targetFile, Rename.PREFIX_DOT_THUMBNAIL);
            } else if (width == 0 && height > 0) {
                Thumbnails.of(entry.getValue().stream().toArray(File[]::new))
                    .height(height)
                    .toFiles(targetFile, Rename.PREFIX_DOT_THUMBNAIL);
            } else if (width > 0 && height == 0) {
                Thumbnails.of(entry.getValue().stream().toArray(File[]::new))
                    .width(width)
                    .toFiles(targetFile, Rename.PREFIX_DOT_THUMBNAIL);
            } else {
                Thumbnails.of(entry.getValue().stream().toArray(File[]::new))
                    .size(width, height)
                    .toFiles(targetFile, Rename.PREFIX_DOT_THUMBNAIL);
            }
        }
    }

    /**
     * 递归遍历文件文件夹，将文件放入到集合中
     */
    private static void recursiveDir(File file, Path rootPath, HashMap<String, ArrayList<File>> map) throws IOException {
        if (file.isDirectory()) { // 文件夹
            // 读取文件列表
            for (File fs : file.listFiles()) {
                recursiveDir(fs, rootPath, map);
            }
        } else { // 文件
            if (isAllowImage(file)) { // 验证是否是允许的图片
                String relativePs = rootPath.relativize(file.toPath().getParent()).toString();
                if (map.containsKey(relativePs)) { // 之前存在相同路径下的文件
                    map.get(relativePs).add(file);
                } else {
                    ArrayList<File> sites = new ArrayList<File>();
                    sites.add(file);
                    map.put(relativePs, sites);
                }
            }
        }
    }
}
